#pragma once
#include <libmesh/libmesh.h>
#include <libmesh/mesh.h>

#include <memory>
#include <string>
#include <vector>

namespace cem
{

// MeshManager 负责网格对象的创建与生命周期管理及基础工具。
class MeshManager
{
public:
    // 构造函数：基于给定并行通信器创建空网格对象。
    explicit MeshManager(const libMesh::Parallel::Communicator & comm);

    // 函数: prepare_empty_mesh
    // 作用: 对当前网格对象执行最小化准备流程（允许重编号并调用 prepare_for_use）。
    // 参数: 无
    // 返回: 无
    void prepare_empty_mesh();

    // 函数: load_gmsh_mesh
    // 作用: 使用 libMesh::GmshIO 读取 Gmsh 网格文件，并执行 prepare_for_use。
    // 参数: path - 网格文件路径
    // 返回: 无（若读取失败将由 libMesh 抛出异常）
    void load_gmsh_mesh(const std::string & path);

    // 函数: get_mesh
    // 作用: 返回底层网格对象的可变引用，便于后续模块访问。
    // 参数: 无
    // 返回: libMesh::Mesh 引用
    libMesh::Mesh & get_mesh();

    // 函数: get_mesh
    // 作用: 返回底层网格对象的常量引用。
    // 参数: 无
    // 返回: libMesh::Mesh 常量引用
    const libMesh::Mesh & get_mesh() const;

    // 函数: get_subdomain_ids
    // 作用: 收集全网格中出现过的子区域 id（去重后按升序返回）。
    // 参数: 无
    // 返回: 子区域 id 列表
    std::vector<libMesh::subdomain_id_type> get_subdomain_ids() const;

    // 函数: get_boundary_ids
    // 作用: 收集全网格中出现过的边界 id（去重后按升序返回）。
    // 参数: 无
    // 返回: 边界 id 列表
    std::vector<libMesh::boundary_id_type> get_boundary_ids() const;

private:
    std::unique_ptr<libMesh::Mesh> _mesh; // 底层网格对象
};

} // namespace cem